﻿#region Copyright RenGuiYou. All rights reserved.
//=====================================================
// NeatlyFrameWork
// Author:      RenGuiyou
// Feedback: 	mailto:750539605@qq.com
//=====================================================
#endregion
using System.Collections.Generic;
using UnityEngine;

//后期优化为byte1024
public class PacketWriter
{
    private const byte FALSE = 0;
    private const byte TRUE = 1;
    private readonly List<byte> byteList = new();

    public void RequireAppendSize(int size)
    {
        for (int i = 0; i < size; i++)
        {
            Write(FALSE);
        }
    }

    public void Init()
    {
        byteList.Clear();
    }

    public int GetLength()
    {
        return byteList.Count;
    }

    public void Write(byte val)
    {
        byteList.Add(val);
    }

    public void Write(int val)
    {
        byteList.Add((byte)(val >> 24));
        byteList.Add((byte)(val >> 16));
        byteList.Add((byte)(val >> 8));
        byteList.Add((byte)(val));
    }

    public void WritePackageLength(int val)
    {
        byteList.Add((byte)(val >> 16));
        byteList.Add((byte)(val >> 8));
        byteList.Add((byte)(val));
    }

    public void Append(byte[] bytes)
    {
        foreach (var b in bytes)
        {
            Write(b);
        }
    }

    public void Write(long val)
    {
        byteList.Add((byte)(val >> 56));
        byteList.Add((byte)(val >> 48));
        byteList.Add((byte)(val >> 40));
        byteList.Add((byte)(val >> 32));
        byteList.Add((byte)(val >> 24));
        byteList.Add((byte)(val >> 16));
        byteList.Add((byte)(val >> 8));
        byteList.Add((byte)(val));
    }

    public void Write(uint val)
    {
        byteList.Add((byte)(val >> 24));
        byteList.Add((byte)(val >> 16));
        byteList.Add((byte)(val >> 8));
        byteList.Add((byte)(val));
    }

    //    public unsafe void Write(float val)
    //    {
    //        uint num = *(uint*)&val;
    //        Write(num);
    //    }

    public void Write(float val)
    {
        Write((int)(val * 1000.0f));
    }

    public void Write(short val)
    {
        byteList.Add((byte)(val >> 8));
        byteList.Add((byte)(val));
    }

    public void Write(ushort val)
    {
        byteList.Add((byte)(val >> 8));
        byteList.Add((byte)(val));
    }

    public void Write(bool val)
    {
        byte b = val ? TRUE : FALSE;
        Write(b);
    }

    public void Write(string val)
    {
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(val);
        Write(bytes);
    }

    public void Write(List<long> data)
    {
        Write(data.Count);
        foreach (var l in data)
        {
            Write(l);
        }
    }

    public void Write(byte[] bytes)
    {
        Write(bytes.Length);
        foreach (var b in bytes)
        {
            Write(b);
        }
    }

    public void Write(Vector3 val)
    {
        Write(val.x);
        Write(val.y);
        Write(val.z);
    }

    public void Write(Quaternion val)
    {
        Write(val.x);
        Write(val.y);
        Write(val.z);
        Write(val.w);
    }

    public List<byte> GetBytes()
    {
        return byteList;
    }
}